home *** CD-ROM | disk | FTP | other *** search
/ PC User 2003 January / Disc 3 / Amethyst.iso / live / usr / include / db.h < prev    next >
Encoding:
C/C++ Source or Header  |  2001-04-26  |  37.1 KB  |  1,051 lines

  1. /*-
  2.  * See the file LICENSE for redistribution information.
  3.  *
  4.  * Copyright (c) 1996, 1997, 1998
  5.  *    Sleepycat Software.  All rights reserved.
  6.  *
  7.  *    @(#)db.h    10.174 (Sleepycat) 1/3/99
  8.  */
  9.  
  10. #ifndef _DB_H_
  11. #define    _DB_H_
  12.  
  13. #ifndef __NO_SYSTEM_INCLUDES
  14. #include <sys/types.h>
  15.  
  16. #include <stdio.h>
  17. #endif
  18.  
  19. /*
  20.  * XXX
  21.  * MacOS: ensure that Metrowerks C makes enumeration types int sized.
  22.  */
  23. #ifdef __MWERKS__
  24. #pragma enumsalwaysint on
  25. #endif
  26.  
  27. /*
  28.  * XXX
  29.  * Handle function prototypes and the keyword "const".  This steps on name
  30.  * space that DB doesn't control, but all of the other solutions are worse.
  31.  *
  32.  * XXX
  33.  * While Microsoft's compiler is ANSI C compliant, it doesn't have _STDC_
  34.  * defined by default, you specify a command line flag or #pragma to turn
  35.  * it on.  Don't do that, however, because some of Microsoft's own header
  36.  * files won't compile.
  37.  */
  38. #undef    __P
  39. #if defined(__STDC__) || defined(__cplusplus) || defined(_MSC_VER)
  40. #define    __P(protos)    protos        /* ANSI C prototypes */
  41. #else
  42. #define    const
  43. #define    __P(protos)    ()        /* K&R C preprocessor */
  44. #endif
  45.  
  46. /*
  47.  * !!!
  48.  * DB needs basic information about specifically sized types.  If they're
  49.  * not provided by the system, typedef them here.
  50.  *
  51.  * We protect them against multiple inclusion using __BIT_TYPES_DEFINED__,
  52.  * as does BIND and Kerberos, since we don't know for sure what #include
  53.  * files the user is using.
  54.  *
  55.  * !!!
  56.  * We also provide the standard u_int, u_long etc., if they're not provided
  57.  * by the system.
  58.  */
  59. #ifndef    __BIT_TYPES_DEFINED__
  60. #define    __BIT_TYPES_DEFINED__
  61.  
  62.  
  63.  
  64.  
  65.  
  66. #endif
  67.  
  68.  
  69.  
  70.  
  71.  
  72.  
  73. #define    DB_VERSION_MAJOR    2
  74. #define    DB_VERSION_MINOR    7
  75. #define    DB_VERSION_PATCH    7
  76. #define    DB_VERSION_STRING    "Sleepycat Software: Berkeley DB 2.7.7: (08/20/99)"
  77.  
  78. typedef    u_int32_t    db_pgno_t;    /* Page number type. */
  79. typedef    u_int16_t    db_indx_t;    /* Page offset type. */
  80. #define    DB_MAX_PAGES    0xffffffff    /* >= # of pages in a file */
  81.  
  82. typedef    u_int32_t    db_recno_t;    /* Record number type. */
  83. #define    DB_MAX_RECORDS    0xffffffff    /* >= # of records in a tree */
  84.  
  85. typedef size_t        DB_LOCK;    /* Object returned by lock manager. */
  86.  
  87. /* Forward structure declarations, so applications get type checking. */
  88. struct __db;        typedef struct __db DB;
  89. #ifdef DB_DBM_HSEARCH
  90.             typedef struct __db DBM;
  91. #endif
  92. struct __db_bt_stat;    typedef struct __db_bt_stat DB_BTREE_STAT;
  93. struct __db_dbt;    typedef struct __db_dbt DBT;
  94. struct __db_env;    typedef struct __db_env DB_ENV;
  95. struct __db_ilock;    typedef struct __db_ilock DB_LOCK_ILOCK;
  96. struct __db_info;    typedef struct __db_info DB_INFO;
  97. struct __db_lock_stat;    typedef struct __db_lock_stat DB_LOCK_STAT;
  98. struct __db_lockregion;    typedef struct __db_lockregion DB_LOCKREGION;
  99. struct __db_lockreq;    typedef struct __db_lockreq DB_LOCKREQ;
  100. struct __db_locktab;    typedef struct __db_locktab DB_LOCKTAB;
  101. struct __db_log;    typedef struct __db_log DB_LOG;
  102. struct __db_log_stat;    typedef struct __db_log_stat DB_LOG_STAT;
  103. struct __db_lsn;    typedef struct __db_lsn DB_LSN;
  104. struct __db_mpool;    typedef struct __db_mpool DB_MPOOL;
  105. struct __db_mpool_finfo;typedef struct __db_mpool_finfo DB_MPOOL_FINFO;
  106. struct __db_mpool_fstat;typedef struct __db_mpool_fstat DB_MPOOL_FSTAT;
  107. struct __db_mpool_stat;    typedef struct __db_mpool_stat DB_MPOOL_STAT;
  108. struct __db_mpoolfile;    typedef struct __db_mpoolfile DB_MPOOLFILE;
  109. struct __db_txn;    typedef struct __db_txn DB_TXN;
  110. struct __db_txn_active;    typedef struct __db_txn_active DB_TXN_ACTIVE;
  111. struct __db_txn_stat;    typedef struct __db_txn_stat DB_TXN_STAT;
  112. struct __db_txnmgr;    typedef struct __db_txnmgr DB_TXNMGR;
  113. struct __db_txnregion;    typedef struct __db_txnregion DB_TXNREGION;
  114. struct __dbc;        typedef struct __dbc DBC;
  115.  
  116. /* Key/data structure -- a Data-Base Thang. */
  117. struct __db_dbt {
  118.     void     *data;            /* key/data */
  119.     u_int32_t size;            /* key/data length */
  120.     u_int32_t ulen;            /* RO: length of user buffer. */
  121.     u_int32_t dlen;            /* RO: get/put record length. */
  122.     u_int32_t doff;            /* RO: get/put record offset. */
  123.  
  124. #define    DB_DBT_INTERNAL    0x01        /* Ignore user's malloc (internal). */
  125. #define    DB_DBT_MALLOC    0x02        /* Return in allocated memory. */
  126. #define    DB_DBT_PARTIAL    0x04        /* Partial put/get. */
  127. #define    DB_DBT_USERMEM    0x08        /* Return in user's memory. */
  128.     u_int32_t flags;
  129. };
  130.  
  131. /*
  132.  * DB run-time interface configuration.
  133.  *
  134.  * There are a set of functions that the application can replace with its
  135.  * own versions, and some other knobs which can be turned at run-time.
  136.  */
  137. #define    DB_FUNC_CLOSE     1        /* POSIX 1003.1 close. */
  138. #define    DB_FUNC_DIRFREE     2        /* DB: free directory list. */
  139. #define    DB_FUNC_DIRLIST     3        /* DB: create directory list. */
  140. #define    DB_FUNC_EXISTS     4        /* DB: return if file exists. */
  141. #define    DB_FUNC_FREE     5        /* ANSI C free. */
  142. #define    DB_FUNC_FSYNC     6        /* POSIX 1003.1 fsync. */
  143. #define    DB_FUNC_IOINFO     7        /* DB: return file I/O information. */
  144. #define    DB_FUNC_MALLOC     8        /* ANSI C malloc. */
  145. #define    DB_FUNC_MAP     9        /* DB: map file into shared memory. */
  146. #define    DB_FUNC_OPEN    10        /* POSIX 1003.1 open. */
  147. #define    DB_FUNC_READ    11        /* POSIX 1003.1 read. */
  148. #define    DB_FUNC_REALLOC    12        /* ANSI C realloc. */
  149. #define    DB_FUNC_RUNLINK    13        /* DB: remove a shared region. */
  150. #define    DB_FUNC_SEEK    14        /* POSIX 1003.1 lseek. */
  151. #define    DB_FUNC_SLEEP    15        /* DB: sleep secs/usecs. */
  152. #define    DB_FUNC_UNLINK    16        /* POSIX 1003.1 unlink. */
  153. #define    DB_FUNC_UNMAP    17        /* DB: unmap shared memory file. */
  154. #define    DB_FUNC_WRITE    18        /* POSIX 1003.1 write. */
  155. #define    DB_FUNC_YIELD    19        /* DB: yield thread to scheduler. */
  156. #define    DB_MUTEXLOCKS    20        /* DB: turn off all mutex locks. */
  157. #define    DB_PAGEYIELD    21        /* DB: yield the CPU on pool get. */
  158. #define    DB_REGION_ANON    22        /* DB: anonymous, unnamed regions. */
  159. #define    DB_REGION_INIT    23        /* DB: page-fault regions in create. */
  160. #define    DB_REGION_NAME    24        /* DB: anonymous, named regions. */
  161. #define    DB_TSL_SPINS    25        /* DB: initialize spin count. */
  162.  
  163. /*
  164.  * Database configuration and initialization.
  165.  */
  166.  /*
  167.   * Flags understood by both db_open(3) and db_appinit(3).
  168.   */
  169. #define    DB_CREATE          0x000001    /* O_CREAT: create file as necessary. */
  170. #define    DB_NOMMAP          0x000002    /* Don't mmap underlying file. */
  171. #define    DB_THREAD          0x000004    /* Free-thread DB package handles. */
  172.  
  173. /*
  174.  * Flags understood by db_appinit(3).
  175.  */
  176. /*                  0x000007       COMMON MASK. */
  177. #define    DB_INIT_CDB          0x000008    /* Concurrent Access Methods. */
  178. #define    DB_INIT_LOCK          0x000010    /* Initialize locking. */
  179. #define    DB_INIT_LOG          0x000020    /* Initialize logging. */
  180. #define    DB_INIT_MPOOL          0x000040    /* Initialize mpool. */
  181. #define    DB_INIT_TXN          0x000080    /* Initialize transactions. */
  182. #define    DB_MPOOL_PRIVATE      0x000100    /* Mpool: private memory pool. */
  183. #define    DB_RECOVER          0x000200    /* Run normal recovery. */
  184. #define    DB_RECOVER_FATAL      0x000400    /* Run catastrophic recovery. */
  185. #define    DB_TXN_NOSYNC          0x000800    /* Do not sync log on commit. */
  186. #define    DB_USE_ENVIRON          0x001000    /* Use the environment. */
  187. #define    DB_USE_ENVIRON_ROOT   0x002000    /* Use the environment if root. */
  188.  
  189. /*
  190.  * Flags understood by db_open(3).
  191.  *
  192.  * DB_EXCL and DB_TEMPORARY are internal only, and are not documented.
  193.  * DB_SEQUENTIAL is currently internal, but may be exported some day.
  194.  */
  195. /*                  0x000007       COMMON MASK. */
  196. /*                  0x001fff       ALREADY USED. */
  197. #define    DB_EXCL              0x002000    /* O_EXCL: exclusive open (internal). */
  198. #define    DB_RDONLY          0x004000    /* O_RDONLY: read-only. */
  199. #define    DB_SEQUENTIAL          0x008000    /* Sequential access (internal). */
  200. #define    DB_TEMPORARY          0x010000    /* Remove on last close (internal). */
  201. #define    DB_TRUNCATE          0x020000    /* O_TRUNCATE: replace existing DB. */
  202. #define    DB_FCNTL_LOCKING      0x040000    /* Undocumented: fcntl(2) locking. */
  203.  
  204. /*
  205.  * Deadlock detector modes; used in the DBENV structure to configure the
  206.  * locking subsystem.
  207.  */
  208. #define    DB_LOCK_NORUN        0
  209. #define    DB_LOCK_DEFAULT        1    /* Default policy. */
  210. #define    DB_LOCK_OLDEST        2    /* Abort oldest transaction. */
  211. #define    DB_LOCK_RANDOM        3    /* Abort random transaction. */
  212. #define    DB_LOCK_YOUNGEST    4    /* Abort youngest transaction. */
  213.  
  214. struct __db_env {
  215.     int         db_lorder;    /* Byte order. */
  216.  
  217.                     /* Error message callback. */
  218.     void (*db_errcall) __P((const char *, char *));
  219.     FILE        *db_errfile;    /* Error message file stream. */
  220.     const char    *db_errpfx;    /* Error message prefix. */
  221.     int         db_verbose;    /* Generate debugging messages. */
  222.     int         db_panic;    /* Panic flag, callback function. */
  223.     void (*db_paniccall) __P((DB_ENV *, int));
  224.  
  225.     /* User paths. */
  226.     char        *db_home;    /* Database home. */
  227.     char        *db_log_dir;    /* Database log file directory. */
  228.     char        *db_tmp_dir;    /* Database tmp file directory. */
  229.  
  230.     char           **db_data_dir;    /* Database data file directories. */
  231.     int         data_cnt;    /* Database data file slots. */
  232.     int         data_next;    /* Next Database data file slot. */
  233.  
  234.     /* Locking. */
  235.     DB_LOCKTAB    *lk_info;    /* Return from lock_open(). */
  236.     const u_int8_t    *lk_conflicts;    /* Two dimensional conflict matrix. */
  237.     u_int32_t     lk_modes;    /* Number of lock modes in table. */
  238.     u_int32_t     lk_max;    /* Maximum number of locks. */
  239.     u_int32_t     lk_detect;    /* Deadlock detect on all conflicts. */
  240.  
  241.     /* Logging. */
  242.     DB_LOG        *lg_info;    /* Return from log_open(). */
  243.     u_int32_t     lg_max;    /* Maximum file size. */
  244.  
  245.     /* Memory pool. */
  246.     DB_MPOOL    *mp_info;    /* Return from memp_open(). */
  247.     size_t         mp_mmapsize;    /* Maximum file size for mmap. */
  248.     size_t         mp_size;    /* Bytes in the mpool cache. */
  249.  
  250.     /* Transactions. */
  251.     DB_TXNMGR    *tx_info;    /* Return from txn_open(). */
  252.     u_int32_t     tx_max;    /* Maximum number of transactions. */
  253.     int (*tx_recover)        /* Dispatch function for recovery. */
  254.         __P((DB_LOG *, DBT *, DB_LSN *, int, void *));
  255.  
  256.     /*
  257.      * XA support.
  258.      *
  259.      * !!!
  260.      * Explicit representations of structures in queue.h.
  261.      *
  262.      * TAILQ_ENTRY(__db_env);
  263.      */
  264.     struct {
  265.         struct __db_env *tqe_next;
  266.         struct __db_env **tqe_prev;
  267.     } links;
  268.     int         xa_rmid;    /* XA Resource Manager ID. */
  269.     DB_TXN        *xa_txn;    /* XA Current transaction. */
  270.  
  271. #define    DB_ENV_APPINIT        0x01    /* Paths initialized by db_appinit(). */
  272. #define    DB_ENV_CDB        0x02    /* Concurrent DB product. */
  273. #define    DB_ENV_STANDALONE    0x04    /* Test: freestanding environment. */
  274. #define    DB_ENV_THREAD        0x08    /* DB_ENV is multi-threaded. */
  275.     u_int32_t     flags;        /* Flags. */
  276. };
  277.  
  278. /*******************************************************
  279.  * Access methods.
  280.  *******************************************************/
  281. /*
  282.  * !!!
  283.  * Changes here must be reflected in java/src/com/sleepycat/db/Db.java.
  284.  */
  285. typedef enum {
  286.     DB_BTREE=1,            /* B+tree. */
  287.     DB_HASH,            /* Extended Linear Hashing. */
  288.     DB_RECNO,            /* Fixed and variable-length records. */
  289.     DB_UNKNOWN            /* Figure it out on open. */
  290. } DBTYPE;
  291.  
  292. #define    DB_BTREEVERSION    6        /* Current btree version. */
  293. #define    DB_BTREEOLDVER    6        /* Oldest btree version supported. */
  294. #define    DB_BTREEMAGIC    0x053162
  295.  
  296. #define    DB_HASHVERSION    5        /* Current hash version. */
  297. #define    DB_HASHOLDVER    4        /* Oldest hash version supported. */
  298. #define    DB_HASHMAGIC    0x061561
  299.  
  300. #define    DB_LOGVERSION    2        /* Current log version. */
  301. #define    DB_LOGOLDVER    2        /* Oldest log version supported. */
  302. #define    DB_LOGMAGIC    0x040988
  303.  
  304. struct __db_info {
  305.     int         db_lorder;    /* Byte order. */
  306.     size_t         db_cachesize;    /* Underlying cache size. */
  307.     size_t         db_pagesize;    /* Underlying page size. */
  308.  
  309.                     /* Local heap allocation. */
  310.     void *(*db_malloc) __P((size_t));
  311.     int (*dup_compare)        /* Duplicate compare function. */
  312.         __P((const DBT *, const DBT *));
  313.  
  314.     /* Btree access method. */
  315.     u_int32_t     bt_maxkey;    /* Maximum keys per page. */
  316.     u_int32_t     bt_minkey;    /* Minimum keys per page. */
  317.     int (*bt_compare)        /* Comparison function. */
  318.         __P((const DBT *, const DBT *));
  319.     size_t (*bt_prefix)        /* Prefix function. */
  320.         __P((const DBT *, const DBT *));
  321.  
  322.     /* Hash access method. */
  323.     u_int32_t      h_ffactor;    /* Fill factor. */
  324.     u_int32_t     h_nelem;    /* Number of elements. */
  325.     u_int32_t      (*h_hash)    /* Hash function. */
  326.         __P((const void *, u_int32_t));
  327.  
  328.     /* Recno access method. */
  329.     int         re_pad;    /* Fixed-length padding byte. */
  330.     int         re_delim;    /* Variable-length delimiting byte. */
  331.     u_int32_t     re_len;    /* Length for fixed-length records. */
  332.     char        *re_source;    /* Source file name. */
  333.  
  334. #define    DB_DELIMITER        0x0001    /* Recno: re_delim set. */
  335. #define    DB_DUP            0x0002    /* Btree, Hash: duplicate keys. */
  336. #define    DB_DUPSORT        0x0004    /* Btree, Hash: duplicate keys. */
  337. #define    DB_FIXEDLEN        0x0008    /* Recno: fixed-length records. */
  338. #define    DB_PAD            0x0010    /* Recno: re_pad set. */
  339. #define    DB_RECNUM        0x0020    /* Btree: record numbers. */
  340. #define    DB_RENUMBER        0x0040    /* Recno: renumber on insert/delete. */
  341. #define    DB_SNAPSHOT        0x0080    /* Recno: snapshot the input. */
  342.     u_int32_t     flags;
  343. };
  344.  
  345. /*
  346.  * DB access method and cursor operation values.  Each value is an operation
  347.  * code to which additional bit flags are added.
  348.  */
  349. #define    DB_AFTER     1        /* c_put() */
  350. #define    DB_APPEND     2        /* put() */
  351. #define    DB_BEFORE     3        /* c_put() */
  352. #define    DB_CHECKPOINT     4        /* log_put(), log_get() */
  353. #define    DB_CURLSN     5        /* log_put() */
  354. #define    DB_CURRENT     6        /* c_get(), c_put(), log_get() */
  355. #define    DB_FIRST     7        /* c_get(), log_get() */
  356. #define    DB_FLUSH     8        /* log_put() */
  357. #define    DB_GET_BOTH     9        /* get(), c_get() */
  358. #define    DB_GET_RECNO    10        /* c_get() */
  359. #define    DB_JOIN_ITEM    11        /* c_get(); do not do primary lookup */
  360. #define    DB_KEYFIRST    12        /* c_put() */
  361. #define    DB_KEYLAST    13        /* c_put() */
  362. #define    DB_LAST        14        /* c_get(), log_get() */
  363. #define    DB_NEXT        15        /* c_get(), log_get() */
  364. #define    DB_NEXT_DUP    16        /* c_get() */
  365. #define    DB_NOOVERWRITE    17        /* put() */
  366. #define    DB_NOSYNC    18        /* close() */
  367. #define    DB_PREV        19        /* c_get(), log_get() */
  368. #define    DB_RECORDCOUNT    20        /* stat() */
  369. #define    DB_SET        21        /* c_get(), log_get() */
  370. #define    DB_SET_RANGE    22        /* c_get() */
  371. #define    DB_SET_RECNO    23        /* get(), c_get() */
  372. #define    DB_WRITELOCK    24        /* cursor() (internal) */
  373.  
  374. #define    DB_OPFLAGS_MASK    0x1f        /* Mask for operations flags. */
  375. #define    DB_RMW        0x80000000    /* Acquire write flag immediately. */
  376.  
  377. /*
  378.  * DB (user visible) error return codes.
  379.  *
  380.  * !!!
  381.  * Changes to any of the user visible error return codes must be reflected
  382.  * in java/src/com/sleepycat/db/Db.java.
  383.  */
  384. #define    DB_INCOMPLETE        ( -1)    /* Sync didn't finish. */
  385. #define    DB_KEYEMPTY        ( -2)    /* The key/data pair was deleted or
  386.                        was never created by the user. */
  387. #define    DB_KEYEXIST        ( -3)    /* The key/data pair already exists. */
  388. #define    DB_LOCK_DEADLOCK    ( -4)    /* Locker killed to resolve deadlock. */
  389. #define    DB_LOCK_NOTGRANTED    ( -5)    /* Lock unavailable, no-wait set. */
  390. #define    DB_LOCK_NOTHELD        ( -6)    /* Lock not held by locker. */
  391. #define    DB_NOTFOUND        ( -7)    /* Key/data pair not found (EOF). */
  392. #define    DB_RUNRECOVERY        ( -8)    /* Panic return. */
  393.  
  394. /* DB (private) error return codes. */
  395. #define    DB_DELETED        ( -9)    /* Recovery file marked deleted. */
  396. #define    DB_NEEDSPLIT        (-10)    /* Page needs to be split. */
  397. #define    DB_SWAPBYTES        (-11)    /* Database needs byte swapping. */
  398. #define    DB_TXN_CKP        (-12)    /* Encountered ckp record in log. */
  399.  
  400. #define    DB_FILE_ID_LEN        20    /* DB file ID length. */
  401.  
  402. /* DB access method description structure. */
  403. struct __db {
  404.     void    *mutexp;        /* Synchronization for free threading */
  405.  
  406.                     /* Documented, returned information. */
  407.     DBTYPE     type;            /* DB access method. */
  408.     int     byteswapped;        /* Database byte order is swapped. */
  409.     int     saved_open_fd;        /* For fcntl lock preservation. */
  410.  
  411.     DB_ENV    *dbenv;            /* DB_ENV structure. */
  412.     DB_ENV    *mp_dbenv;        /* DB_ENV for local mpool creation. */
  413.  
  414.     void    *internal;        /* Access method private. */
  415.  
  416.     DB_MPOOL    *mp;        /* The access method's mpool. */
  417.     DB_MPOOLFILE    *mpf;        /* The access method's mpool file. */
  418.  
  419.     /*
  420.      * !!!
  421.      * Explicit representations of structures in queue.h.
  422.      *
  423.      * TAILQ_HEAD(free_queue, __dbc);
  424.      * TAILQ_HEAD(active_queue, __dbc);
  425.      */
  426.     struct {
  427.         struct __dbc *tqh_first;
  428.         struct __dbc **tqh_last;
  429.     } free_queue;
  430.     struct {
  431.         struct __dbc *tqh_first;
  432.         struct __dbc **tqh_last;
  433.     } active_queue;
  434.  
  435.     u_int8_t  fileid[DB_FILE_ID_LEN]; /* Uniquely identify this file for
  436.                          locking. */
  437.     u_int32_t log_fileid;        /* Logging file id. */
  438.     size_t      pgsize;        /* Logical page size of file. */
  439.  
  440.                     /* Local heap allocation. */
  441.     void *(*db_malloc) __P((size_t));
  442.     int (*dup_compare)        /* Duplicate compare function. */
  443.         __P((const DBT *, const DBT *));
  444.     u_int32_t (*h_hash)        /* Hash function. */
  445.         __P((const void *, u_int32_t));
  446.  
  447.                     /* Functions. */
  448.     int (*am_close)    __P((DB *));
  449.     int (*close)    __P((DB *, u_int32_t));
  450.     int (*cursor)    __P((DB *, DB_TXN *, DBC **, u_int32_t));
  451.     int (*del)    __P((DB *, DB_TXN *, DBT *, u_int32_t));
  452.     int (*fd)    __P((DB *, int *));
  453.     int (*get)    __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
  454.     int (*join)    __P((DB *, DBC **, u_int32_t, DBC **));
  455.     int (*put)    __P((DB *, DB_TXN *, DBT *, DBT *, u_int32_t));
  456.     int (*stat)    __P((DB *, void *, void *(*)(size_t), u_int32_t));
  457.     int (*sync)    __P((DB *, u_int32_t));
  458.  
  459. #define    DB_AM_CDB    0x000001    /* Concurrent Access Methods. */
  460. #define    DB_AM_DUP    0x000002    /* DB_DUP (internal). */
  461. #define    DB_AM_INMEM    0x000004    /* In-memory; no sync on close. */
  462. #define    DB_AM_LOCKING    0x000008    /* Perform locking. */
  463. #define    DB_AM_LOGGING    0x000010    /* Perform logging. */
  464. #define    DB_AM_MLOCAL    0x000020    /* Database memory pool is local. */
  465. #define    DB_AM_PGDEF    0x000040    /* Page size was defaulted. */
  466. #define    DB_AM_RDONLY    0x000080    /* Database is readonly. */
  467. #define    DB_AM_SWAP    0x000100    /* Pages need to be byte-swapped. */
  468. #define    DB_AM_THREAD    0x000200    /* DB is multi-threaded. */
  469. #define    DB_BT_RECNUM    0x000400    /* DB_RECNUM (internal). */
  470. #define    DB_DBM_ERROR    0x000800    /* Error in DBM/NDBM database. */
  471. #define    DB_RE_DELIMITER    0x001000    /* DB_DELIMITER (internal). */
  472. #define    DB_RE_FIXEDLEN    0x002000    /* DB_FIXEDLEN (internal). */
  473. #define    DB_RE_PAD    0x004000    /* DB_PAD (internal). */
  474. #define    DB_RE_RENUMBER    0x008000    /* DB_RENUMBER (internal). */
  475. #define    DB_RE_SNAPSHOT    0x010000    /* DB_SNAPSHOT (internal). */
  476.     u_int32_t flags;
  477. };
  478.  
  479. struct __db_ilock {            /* Internal DB access method lock. */
  480.     db_pgno_t pgno;            /* Page being locked. */
  481.     u_int8_t fileid[DB_FILE_ID_LEN];/* File id. */
  482. };
  483.  
  484. /* Cursor description structure. */
  485. struct __dbc {
  486.     DB *dbp;            /* Related DB access method. */
  487.     DB_TXN     *txn;            /* Associated transaction. */
  488.  
  489.     /*
  490.      * !!!
  491.      * Explicit representations of structures in queue.h.
  492.      *
  493.      * TAILQ_ENTRY(__dbc);
  494.      */
  495.     struct {
  496.         struct __dbc *tqe_next;
  497.         struct __dbc **tqe_prev;
  498.     } links;
  499.  
  500.     u_int32_t lid;            /* Default process' locker id. */
  501.     u_int32_t locker;        /* Locker for this operation. */
  502.     DBT      lock_dbt;        /* DBT referencing lock. */
  503.     DB_LOCK_ILOCK lock;        /* Object to be locked. */
  504.     DB_LOCK    mylock;            /* Lock held on this cursor. */
  505.  
  506.     DBT rkey;            /* Returned key. */
  507.     DBT rdata;            /* Returned data. */
  508.  
  509.     int (*c_am_close) __P((DBC *));
  510.     int (*c_am_destroy) __P((DBC *));
  511.     int (*c_close) __P((DBC *));
  512.     int (*c_del) __P((DBC *, u_int32_t));
  513.     int (*c_get) __P((DBC *, DBT *, DBT *, u_int32_t));
  514.     int (*c_put) __P((DBC *, DBT *, DBT *, u_int32_t));
  515.  
  516.     void     *internal;        /* Access method private. */
  517.  
  518. #define    DBC_CONTINUE    0x001        /* Continue dup search: next item. */
  519. #define    DBC_KEYSET    0x002        /* Continue dup search: current item. */
  520. #define    DBC_RECOVER    0x004        /* In recovery (do not log or lock). */
  521. #define    DBC_RMW        0x008        /* Acquire write flag in read op. */
  522. #define    DBC_WRITER    0x010        /* Cursor immediately writing (CDB). */
  523.     u_int32_t flags;
  524. };
  525.  
  526. /* Btree/recno statistics structure. */
  527. struct __db_bt_stat {
  528.     u_int32_t bt_flags;        /* Open flags. */
  529.     u_int32_t bt_maxkey;        /* Maxkey value. */
  530.     u_int32_t bt_minkey;        /* Minkey value. */
  531.     u_int32_t bt_re_len;        /* Fixed-length record length. */
  532.     u_int32_t bt_re_pad;        /* Fixed-length record pad. */
  533.     u_int32_t bt_pagesize;        /* Page size. */
  534.     u_int32_t bt_levels;        /* Tree levels. */
  535.     u_int32_t bt_nrecs;        /* Number of records. */
  536.     u_int32_t bt_int_pg;        /* Internal pages. */
  537.     u_int32_t bt_leaf_pg;        /* Leaf pages. */
  538.     u_int32_t bt_dup_pg;        /* Duplicate pages. */
  539.     u_int32_t bt_over_pg;        /* Overflow pages. */
  540.     u_int32_t bt_free;        /* Pages on the free list. */
  541.     u_int32_t bt_int_pgfree;    /* Bytes free in internal pages. */
  542.     u_int32_t bt_leaf_pgfree;    /* Bytes free in leaf pages. */
  543.     u_int32_t bt_dup_pgfree;    /* Bytes free in duplicate pages. */
  544.     u_int32_t bt_over_pgfree;    /* Bytes free in overflow pages. */
  545.     u_int32_t bt_magic;        /* Magic number. */
  546.     u_int32_t bt_version;        /* Version number. */
  547. };
  548.  
  549. /* Hash statistics structure. */
  550. struct __db_h_stat {
  551.     u_int32_t hash_accesses;    /* Number of accesses to this table. */
  552.     u_int32_t hash_collisions;    /* Number of collisions on search. */
  553.     u_int32_t hash_expansions;    /* Number of times we added a bucket. */
  554.     u_int32_t hash_overflows;    /* Number of overflow pages. */
  555.     u_int32_t hash_bigpages;    /* Number of big key/data pages. */
  556.     u_int32_t hash_dup;        /* Number of dup pages. */
  557.     u_int32_t hash_free;        /* Pages on the free list. */
  558.     u_int32_t hash_bfree;        /* Bytes free on bucket pages. */
  559.     u_int32_t hash_dup_free;    /* Bytes free on duplicate pages. */
  560.     u_int32_t hash_big_bfree;    /* Bytes free on big item pages. */
  561.     u_int32_t hash_buckets;        /* Number of hash buckets. */
  562.     u_int32_t hash_put;        /* Number of puts. */
  563.     u_int32_t hash_deleted;        /* Number of deletes. */
  564.     u_int32_t hash_get;        /* Number of gets. */
  565.     u_int32_t hash_magic;        /* Magic number. */
  566.     u_int32_t hash_version;        /* Version number. */
  567.     u_int32_t hash_pagesize;    /* Page size. */
  568.     u_int32_t hash_nrecs;        /* Number of records. */
  569. };
  570.  
  571. #if defined(__cplusplus)
  572. extern "C" {
  573. #endif
  574. int   db_appinit __P((const char *, char * const *, DB_ENV *, u_int32_t));
  575. int   db_appexit __P((DB_ENV *));
  576. int   db_jump_set __P((void *, int));
  577. int   db_open __P((const char *,
  578.       DBTYPE, u_int32_t, int, DB_ENV *, DB_INFO *, DB **));
  579. int   db_value_set __P((int, int));
  580. char *db_version __P((int *, int *, int *));
  581. int   db_xa_open __P((const char *,
  582.       DBTYPE, u_int32_t, int, DB_INFO *, DB **));
  583. #if defined(__cplusplus)
  584. }
  585. #endif
  586.  
  587. /*******************************************************
  588.  * Locking
  589.  *******************************************************/
  590. #define    DB_LOCKVERSION    1
  591. #define    DB_LOCKMAGIC    0x090193
  592.  
  593. /* Flag values for lock_vec(), lock_get(). */
  594. #define    DB_LOCK_NOWAIT        0x01    /* Don't wait on unavailable lock. */
  595. #define    DB_LOCK_UPGRADE        0x02    /* Upgrade an existing lock instead
  596.                        of granting a new one (internal). */
  597.  
  598. /* Flag values for lock_detect(). */
  599. #define    DB_LOCK_CONFLICT    0x01    /* Run on any conflict. */
  600.  
  601. /*
  602.  * Request types.
  603.  *
  604.  * !!!
  605.  * Changes here must be reflected in java/src/com/sleepycat/db/Db.java.
  606.  */
  607. typedef enum {
  608.     DB_LOCK_DUMP=0,            /* Display held locks. */
  609.     DB_LOCK_GET,            /* Get the lock. */
  610.     DB_LOCK_INHERIT,        /* Pass locks to parent. */
  611.     DB_LOCK_PUT,            /* Release the lock. */
  612.     DB_LOCK_PUT_ALL,        /* Release locker's locks. */
  613.     DB_LOCK_PUT_OBJ            /* Release locker's locks on obj. */
  614. } db_lockop_t;
  615.  
  616. /*
  617.  * Simple R/W lock modes and for multi-granularity intention locking.
  618.  *
  619.  * !!!
  620.  * These values are NOT random, as they are used as an index into the lock
  621.  * conflicts arrays, i.e., DB_LOCK_IWRITE must be == 3, and DB_LOCK_IREAD
  622.  * must be == 4.
  623.  *
  624.  * !!!
  625.  * Changes here must be reflected in java/src/com/sleepycat/db/Db.java.
  626.  */
  627. typedef enum {
  628.     DB_LOCK_NG=0,            /* Not granted. */
  629.     DB_LOCK_READ,            /* Shared/read. */
  630.     DB_LOCK_WRITE,            /* Exclusive/write. */
  631.     DB_LOCK_IWRITE,            /* Intent exclusive/write. */
  632.     DB_LOCK_IREAD,            /* Intent to share/read. */
  633.     DB_LOCK_IWR            /* Intent to read and write. */
  634. } db_lockmode_t;
  635.  
  636. /*
  637.  * Status of a lock.
  638.  */
  639. typedef enum {
  640.     DB_LSTAT_ABORTED,        /* Lock belongs to an aborted txn. */
  641.     DB_LSTAT_ERR,            /* Lock is bad. */
  642.     DB_LSTAT_FREE,            /* Lock is unallocated. */
  643.     DB_LSTAT_HELD,            /* Lock is currently held. */
  644.     DB_LSTAT_NOGRANT,        /* Lock was not granted. */
  645.     DB_LSTAT_PENDING,        /* Lock was waiting and has been
  646.                      * promoted; waiting for the owner
  647.                      * to run and upgrade it to held. */
  648.     DB_LSTAT_WAITING        /* Lock is on the wait queue. */
  649. } db_status_t;
  650.  
  651. /* Lock request structure. */
  652. struct __db_lockreq {
  653.     db_lockop_t     op;        /* Operation. */
  654.     db_lockmode_t     mode;        /* Requested mode. */
  655.     u_int32_t     locker;    /* Locker identity. */
  656.     DBT        *obj;        /* Object being locked. */
  657.     DB_LOCK         lock;        /* Lock returned. */
  658. };
  659.  
  660. /*
  661.  * Commonly used conflict matrices.
  662.  *
  663.  * Standard Read/Write (or exclusive/shared) locks.
  664.  */
  665. #define    DB_LOCK_RW_N    3
  666. extern const u_int8_t db_rw_conflicts[];
  667.  
  668. /* Multi-granularity locking. */
  669. #define    DB_LOCK_RIW_N    6
  670. extern const u_int8_t db_riw_conflicts[];
  671.  
  672. struct __db_lock_stat {
  673.     u_int32_t st_magic;        /* Lock file magic number. */
  674.     u_int32_t st_version;        /* Lock file version number. */
  675.     u_int32_t st_maxlocks;        /* Maximum number of locks in table. */
  676.     u_int32_t st_nmodes;        /* Number of lock modes. */
  677.     u_int32_t st_numobjs;        /* Number of objects. */
  678.     u_int32_t st_nlockers;        /* Number of lockers. */
  679.     u_int32_t st_nconflicts;    /* Number of lock conflicts. */
  680.     u_int32_t st_nrequests;        /* Number of lock gets. */
  681.     u_int32_t st_nreleases;        /* Number of lock puts. */
  682.     u_int32_t st_ndeadlocks;    /* Number of lock deadlocks. */
  683.     u_int32_t st_region_wait;    /* Region lock granted after wait. */
  684.     u_int32_t st_region_nowait;    /* Region lock granted without wait. */
  685.     u_int32_t st_refcnt;        /* Region reference count. */
  686.     u_int32_t st_regsize;        /* Region size. */
  687. };
  688.  
  689. #if defined(__cplusplus)
  690. extern "C" {
  691. #endif
  692. int      lock_close __P((DB_LOCKTAB *));
  693. int      lock_detect __P((DB_LOCKTAB *, u_int32_t, u_int32_t));
  694. int      lock_get __P((DB_LOCKTAB *,
  695.         u_int32_t, u_int32_t, const DBT *, db_lockmode_t, DB_LOCK *));
  696. int      lock_id __P((DB_LOCKTAB *, u_int32_t *));
  697. int      lock_open __P((const char *,
  698.         u_int32_t, int, DB_ENV *, DB_LOCKTAB **));
  699. int      lock_put __P((DB_LOCKTAB *, DB_LOCK));
  700. int      lock_tget __P((DB_LOCKTAB *,
  701.         DB_TXN *, u_int32_t, const DBT *, db_lockmode_t, DB_LOCK *));
  702. int      lock_stat __P((DB_LOCKTAB *, DB_LOCK_STAT **, void *(*)(size_t)));
  703. int      lock_unlink __P((const char *, int, DB_ENV *));
  704. int      lock_vec __P((DB_LOCKTAB *,
  705.         u_int32_t, u_int32_t, DB_LOCKREQ *, int, DB_LOCKREQ **));
  706. int      lock_tvec __P((DB_LOCKTAB *,
  707.         DB_TXN *, u_int32_t, DB_LOCKREQ *, int, DB_LOCKREQ **));
  708. #if defined(__cplusplus)
  709. }
  710. #endif
  711.  
  712. /*******************************************************
  713.  * Logging.
  714.  *******************************************************/
  715. /* Flag values for log_archive(). */
  716. #define    DB_ARCH_ABS        0x001    /* Absolute pathnames. */
  717. #define    DB_ARCH_DATA        0x002    /* Data files. */
  718. #define    DB_ARCH_LOG        0x004    /* Log files. */
  719.  
  720. /*
  721.  * A DB_LSN has two parts, a fileid which identifies a specific file, and an
  722.  * offset within that file.  The fileid is an unsigned 4-byte quantity that
  723.  * uniquely identifies a file within the log directory -- currently a simple
  724.  * counter inside the log.  The offset is also an unsigned 4-byte value.  The
  725.  * log manager guarantees the offset is never more than 4 bytes by switching
  726.  * to a new log file before the maximum length imposed by an unsigned 4-byte
  727.  * offset is reached.
  728.  */
  729. struct __db_lsn {
  730.     u_int32_t    file;        /* File ID. */
  731.     u_int32_t    offset;        /* File offset. */
  732. };
  733.  
  734. /* Log statistics structure. */
  735. struct __db_log_stat {
  736.     u_int32_t st_magic;        /* Log file magic number. */
  737.     u_int32_t st_version;        /* Log file version number. */
  738.     int st_mode;            /* Log file mode. */
  739.     u_int32_t st_lg_max;        /* Maximum log file size. */
  740.     u_int32_t st_w_bytes;        /* Bytes to log. */
  741.     u_int32_t st_w_mbytes;        /* Megabytes to log. */
  742.     u_int32_t st_wc_bytes;        /* Bytes to log since checkpoint. */
  743.     u_int32_t st_wc_mbytes;        /* Megabytes to log since checkpoint. */
  744.     u_int32_t st_wcount;        /* Total syncs to the log. */
  745.     u_int32_t st_scount;        /* Total writes to the log. */
  746.     u_int32_t st_region_wait;    /* Region lock granted after wait. */
  747.     u_int32_t st_region_nowait;    /* Region lock granted without wait. */
  748.     u_int32_t st_cur_file;        /* Current log file number. */
  749.     u_int32_t st_cur_offset;    /* Current log file offset. */
  750.     u_int32_t st_refcnt;        /* Region reference count. */
  751.     u_int32_t st_regsize;        /* Region size. */
  752. };
  753.  
  754. #if defined(__cplusplus)
  755. extern "C" {
  756. #endif
  757. int     log_archive __P((DB_LOG *, char **[], u_int32_t, void *(*)(size_t)));
  758. int     log_close __P((DB_LOG *));
  759. int     log_compare __P((const DB_LSN *, const DB_LSN *));
  760. int     log_file __P((DB_LOG *, const DB_LSN *, char *, size_t));
  761. int     log_flush __P((DB_LOG *, const DB_LSN *));
  762. int     log_get __P((DB_LOG *, DB_LSN *, DBT *, u_int32_t));
  763. int     log_open __P((const char *, u_int32_t, int, DB_ENV *, DB_LOG **));
  764. int     log_put __P((DB_LOG *, DB_LSN *, const DBT *, u_int32_t));
  765. int     log_register __P((DB_LOG *, DB *, const char *, DBTYPE, u_int32_t *));
  766. int     log_stat __P((DB_LOG *, DB_LOG_STAT **, void *(*)(size_t)));
  767. int     log_unlink __P((const char *, int, DB_ENV *));
  768. int     log_unregister __P((DB_LOG *, u_int32_t));
  769. #if defined(__cplusplus)
  770. }
  771. #endif
  772.  
  773. /*******************************************************
  774.  * Mpool
  775.  *******************************************************/
  776. /* Flag values for memp_fget(). */
  777. #define    DB_MPOOL_CREATE        0x001    /* Create a page. */
  778. #define    DB_MPOOL_LAST        0x002    /* Return the last page. */
  779. #define    DB_MPOOL_NEW        0x004    /* Create a new page. */
  780.  
  781. /* Flag values for memp_fput(), memp_fset(). */
  782. #define    DB_MPOOL_CLEAN        0x001    /* Clear modified bit. */
  783. #define    DB_MPOOL_DIRTY        0x002    /* Page is modified. */
  784. #define    DB_MPOOL_DISCARD    0x004    /* Don't cache the page. */
  785.  
  786. /* Mpool statistics structure. */
  787. struct __db_mpool_stat {
  788.     size_t st_cachesize;        /* Cache size. */
  789.     u_int32_t st_cache_hit;        /* Pages found in the cache. */
  790.     u_int32_t st_cache_miss;    /* Pages not found in the cache. */
  791.     u_int32_t st_map;        /* Pages from mapped files. */
  792.     u_int32_t st_page_create;    /* Pages created in the cache. */
  793.     u_int32_t st_page_in;        /* Pages read in. */
  794.     u_int32_t st_page_out;        /* Pages written out. */
  795.     u_int32_t st_ro_evict;        /* Clean pages forced from the cache. */
  796.     u_int32_t st_rw_evict;        /* Dirty pages forced from the cache. */
  797.     u_int32_t st_hash_buckets;    /* Number of hash buckets. */
  798.     u_int32_t st_hash_searches;    /* Total hash chain searches. */
  799.     u_int32_t st_hash_longest;    /* Longest hash chain searched. */
  800.     u_int32_t st_hash_examined;    /* Total hash entries searched. */
  801.     u_int32_t st_page_clean;    /* Clean pages. */
  802.     u_int32_t st_page_dirty;    /* Dirty pages. */
  803.     u_int32_t st_page_trickle;    /* Pages written by memp_trickle. */
  804.     u_int32_t st_region_wait;    /* Region lock granted after wait. */
  805.     u_int32_t st_region_nowait;    /* Region lock granted without wait. */
  806.     u_int32_t st_refcnt;        /* Region reference count. */
  807.     u_int32_t st_regsize;        /* Region size. */
  808. };
  809.  
  810. /* Mpool file open information structure. */
  811. struct __db_mpool_finfo {
  812.     int       ftype;        /* File type. */
  813.     DBT      *pgcookie;        /* Byte-string passed to pgin/pgout. */
  814.     u_int8_t  *fileid;        /* Unique file ID. */
  815.     int32_t       lsn_offset;        /* LSN offset in page. */
  816.     u_int32_t  clear_len;        /* Cleared length on created pages. */
  817. };
  818.  
  819. /* Mpool file statistics structure. */
  820. struct __db_mpool_fstat {
  821.     char *file_name;        /* File name. */
  822.     size_t st_pagesize;        /* Page size. */
  823.     u_int32_t st_cache_hit;        /* Pages found in the cache. */
  824.     u_int32_t st_cache_miss;    /* Pages not found in the cache. */
  825.     u_int32_t st_map;        /* Pages from mapped files. */
  826.     u_int32_t st_page_create;    /* Pages created in the cache. */
  827.     u_int32_t st_page_in;        /* Pages read in. */
  828.     u_int32_t st_page_out;        /* Pages written out. */
  829. };
  830.  
  831. #if defined(__cplusplus)
  832. extern "C" {
  833. #endif
  834. int    memp_close __P((DB_MPOOL *));
  835. int    memp_fclose __P((DB_MPOOLFILE *));
  836. int    memp_fget __P((DB_MPOOLFILE *, db_pgno_t *, u_int32_t, void *));
  837. int    memp_fopen __P((DB_MPOOL *, const char *,
  838.         u_int32_t, int, size_t, DB_MPOOL_FINFO *, DB_MPOOLFILE **));
  839. int    memp_fput __P((DB_MPOOLFILE *, void *, u_int32_t));
  840. int    memp_fset __P((DB_MPOOLFILE *, void *, u_int32_t));
  841. int    memp_fsync __P((DB_MPOOLFILE *));
  842. int    memp_open __P((const char *, u_int32_t, int, DB_ENV *, DB_MPOOL **));
  843. int    memp_register __P((DB_MPOOL *, int,
  844.         int (*)(db_pgno_t, void *, DBT *),
  845.         int (*)(db_pgno_t, void *, DBT *)));
  846. int    memp_stat __P((DB_MPOOL *,
  847.         DB_MPOOL_STAT **, DB_MPOOL_FSTAT ***, void *(*)(size_t)));
  848. int    memp_sync __P((DB_MPOOL *, DB_LSN *));
  849. int    memp_trickle __P((DB_MPOOL *, int, int *));
  850. int    memp_unlink __P((const char *, int, DB_ENV *));
  851. #if defined(__cplusplus)
  852. }
  853. #endif
  854.  
  855. /*******************************************************
  856.  * Transactions.
  857.  *******************************************************/
  858. #define    DB_TXNVERSION    1
  859. #define    DB_TXNMAGIC    0x041593
  860.  
  861. /* Operations values to the tx_recover() function. */
  862. #define    DB_TXN_BACKWARD_ROLL    1    /* Read the log backwards. */
  863. #define    DB_TXN_FORWARD_ROLL    2    /* Read the log forwards. */
  864. #define    DB_TXN_OPENFILES    3    /* Read for open files. */
  865. #define    DB_TXN_REDO        4    /* Redo the operation. */
  866. #define    DB_TXN_UNDO        5    /* Undo the operation. */
  867.  
  868. /* Internal transaction status values. */
  869.  
  870. /* Transaction statistics structure. */
  871. struct __db_txn_active {
  872.     u_int32_t    txnid;        /* Transaction ID */
  873.     DB_LSN        lsn;        /* Lsn of the begin record */
  874. };
  875.  
  876. struct __db_txn_stat {
  877.     DB_LSN      st_last_ckp;        /* lsn of the last checkpoint */
  878.     DB_LSN      st_pending_ckp;    /* last checkpoint did not finish */
  879.     time_t      st_time_ckp;        /* time of last checkpoint */
  880.     u_int32_t st_last_txnid;    /* last transaction id given out */
  881.     u_int32_t st_maxtxns;    /* maximum number of active txns */
  882.     u_int32_t st_naborts;    /* number of aborted transactions */
  883.     u_int32_t st_nbegins;    /* number of begun transactions */
  884.     u_int32_t st_ncommits;    /* number of committed transactions */
  885.     u_int32_t st_nactive;    /* number of active transactions */
  886.     DB_TXN_ACTIVE
  887.          *st_txnarray;    /* array of active transactions */
  888.     u_int32_t st_region_wait;    /* Region lock granted after wait. */
  889.     u_int32_t st_region_nowait;    /* Region lock granted without wait. */
  890.     u_int32_t st_refcnt;        /* Region reference count. */
  891.     u_int32_t st_regsize;        /* Region size. */
  892. };
  893.  
  894. #if defined(__cplusplus)
  895. extern "C" {
  896. #endif
  897. int      txn_abort __P((DB_TXN *));
  898. int      txn_begin __P((DB_TXNMGR *, DB_TXN *, DB_TXN **));
  899. int      txn_checkpoint __P((const DB_TXNMGR *, u_int32_t, u_int32_t));
  900. int      txn_commit __P((DB_TXN *));
  901. int      txn_close __P((DB_TXNMGR *));
  902. u_int32_t txn_id __P((DB_TXN *));
  903. int      txn_open __P((const char *, u_int32_t, int, DB_ENV *, DB_TXNMGR **));
  904. int      txn_prepare __P((DB_TXN *));
  905. int      txn_stat __P((DB_TXNMGR *, DB_TXN_STAT **, void *(*)(size_t)));
  906. int      txn_unlink __P((const char *, int, DB_ENV *));
  907. #if defined(__cplusplus)
  908. }
  909. #endif
  910.  
  911. #ifndef DB_DBM_HSEARCH
  912. #define    DB_DBM_HSEARCH    0        /* No historic interfaces by default. */
  913. #endif
  914. #if DB_DBM_HSEARCH != 0
  915. /*******************************************************
  916.  * Dbm/Ndbm historic interfaces.
  917.  *******************************************************/
  918. #define    DBM_INSERT    0        /* Flags to dbm_store(). */
  919. #define    DBM_REPLACE    1
  920.  
  921. /*
  922.  * The db(3) support for ndbm(3) always appends this suffix to the
  923.  * file name to avoid overwriting the user's original database.
  924.  */
  925. #define    DBM_SUFFIX    ".db"
  926.  
  927. #if defined(_XPG4_2)
  928. typedef struct {
  929.     char *dptr;
  930.     size_t dsize;
  931. } datum;
  932. #else
  933. typedef struct {
  934.     char *dptr;
  935.     int dsize;
  936. } datum;
  937. #endif
  938.  
  939. /*
  940.  * Translate DBM calls into DB calls so that DB doesn't step on the
  941.  * application's name space.
  942.  *
  943.  * The global variables dbrdonly, dirf and pagf were not retained when
  944.  * 4BSD replaced the dbm interface with ndbm, and are not support here.
  945.  */
  946. #define    dbminit(a)    __db_dbm_init(a)
  947. #define    dbmclose    __db_dbm_close
  948. #if !defined(__cplusplus)
  949. #define    delete(a)    __db_dbm_delete(a)
  950. #endif
  951. #define    fetch(a)    __db_dbm_fetch(a)
  952. #define    firstkey    __db_dbm_firstkey
  953. #define    nextkey(a)    __db_dbm_nextkey(a)
  954. #define    store(a, b)    __db_dbm_store(a, b)
  955.  
  956. /* Prototype the DB calls. */
  957. #if defined(__cplusplus)
  958. extern "C" {
  959. #endif
  960. int     __db_dbm_close __P((void));
  961. int     __db_dbm_dbrdonly __P((void));
  962. int     __db_dbm_delete __P((datum));
  963. int     __db_dbm_dirf __P((void));
  964. datum     __db_dbm_fetch __P((datum));
  965. datum     __db_dbm_firstkey __P((void));
  966. int     __db_dbm_init __P((char *));
  967. datum     __db_dbm_nextkey __P((datum));
  968. int     __db_dbm_pagf __P((void));
  969. int     __db_dbm_store __P((datum, datum));
  970. #if defined(__cplusplus)
  971. }
  972. #endif
  973.  
  974. /*
  975.  * Translate NDBM calls into DB calls so that DB doesn't step on the
  976.  * application's name space.
  977.  */
  978. #define    dbm_clearerr(a)        __db_ndbm_clearerr(a)
  979. #define    dbm_close(a)        __db_ndbm_close(a)
  980. #define    dbm_delete(a, b)    __db_ndbm_delete(a, b)
  981. #define    dbm_dirfno(a)        __db_ndbm_dirfno(a)
  982. #define    dbm_error(a)        __db_ndbm_error(a)
  983. #define    dbm_fetch(a, b)        __db_ndbm_fetch(a, b)
  984. #define    dbm_firstkey(a)        __db_ndbm_firstkey(a)
  985. #define    dbm_nextkey(a)        __db_ndbm_nextkey(a)
  986. #define    dbm_open(a, b, c)    __db_ndbm_open(a, b, c)
  987. #define    dbm_pagfno(a)        __db_ndbm_pagfno(a)
  988. #define    dbm_rdonly(a)        __db_ndbm_rdonly(a)
  989. #define    dbm_store(a, b, c, d)    __db_ndbm_store(a, b, c, d)
  990.  
  991. /* Prototype the DB calls. */
  992. #if defined(__cplusplus)
  993. extern "C" {
  994. #endif
  995. int     __db_ndbm_clearerr __P((DBM *));
  996. void     __db_ndbm_close __P((DBM *));
  997. int     __db_ndbm_delete __P((DBM *, datum));
  998. int     __db_ndbm_dirfno __P((DBM *));
  999. int     __db_ndbm_error __P((DBM *));
  1000. datum     __db_ndbm_fetch __P((DBM *, datum));
  1001. datum     __db_ndbm_firstkey __P((DBM *));
  1002. datum     __db_ndbm_nextkey __P((DBM *));
  1003. DBM    *__db_ndbm_open __P((const char *, int, int));
  1004. int     __db_ndbm_pagfno __P((DBM *));
  1005. int     __db_ndbm_rdonly __P((DBM *));
  1006. int     __db_ndbm_store __P((DBM *, datum, datum, int));
  1007. #if defined(__cplusplus)
  1008. }
  1009. #endif
  1010.  
  1011. /*******************************************************
  1012.  * Hsearch historic interface.
  1013.  *******************************************************/
  1014. typedef enum {
  1015.     FIND, ENTER
  1016. } ACTION;
  1017.  
  1018. typedef struct entry {
  1019.     char *key;
  1020.     char *data;
  1021. } ENTRY;
  1022.  
  1023. /*
  1024.  * Translate HSEARCH calls into DB calls so that DB doesn't step on the
  1025.  * application's name space.
  1026.  */
  1027. #define    hcreate(a)    __db_hcreate(a)
  1028. #define    hdestroy    __db_hdestroy
  1029. #define    hsearch(a, b)    __db_hsearch(a, b)
  1030.  
  1031. /* Prototype the DB calls. */
  1032. #if defined(__cplusplus)
  1033. extern "C" {
  1034. #endif
  1035. int     __db_hcreate __P((size_t));
  1036. void     __db_hdestroy __P((void));
  1037. ENTRY    *__db_hsearch __P((ENTRY, ACTION));
  1038. #if defined(__cplusplus)
  1039. }
  1040. #endif
  1041. #endif /* DB_DBM_HSEARCH */
  1042.  
  1043. /*
  1044.  * XXX
  1045.  * MacOS: Reset Metrowerks C enum sizes.
  1046.  */
  1047. #ifdef __MWERKS__
  1048. #pragma enumsalwaysint reset
  1049. #endif
  1050. #endif /* !_DB_H_ */
  1051.